home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / src / GLperf3.12-src.lha / GLperf / VertexX.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-01  |  11.9 KB  |  370 lines

  1. /*
  2. //   (C) COPYRIGHT International Business Machines Corp. 1993
  3. //   All Rights Reserved
  4. //   Licensed Materials - Property of IBM
  5. //   US Government Users Restricted Rights - Use, duplication or
  6. //   disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. //
  8.  
  9. //
  10. // Permission to use, copy, modify, and distribute this software and its
  11. // documentation for any purpose and without fee is hereby granted, provided
  12. // that the above copyright notice appear in all copies and that both that
  13. // copyright notice and this permission notice appear in supporting
  14. // documentation, and that the name of I.B.M. not be used in advertising
  15. // or publicity pertaining to distribution of the software without specific,
  16. // written prior permission. I.B.M. makes no representations about the
  17. // suitability of this software for any purpose.  It is provided "as is"
  18. // without express or implied warranty.
  19. //
  20. // I.B.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
  21. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL I.B.M.
  22. // BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  23. // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  24. // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  25. // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  26. //
  27. // Author:  John Spitzer, IBM AWS Graphics Systems (Austin)
  28. //
  29. */
  30.  
  31. /* Define calls if using function pointers or not */
  32. #ifdef FUNCTION_PTRS
  33.   #if (COLOR_DIM == 3)
  34.     #define COLOR_CALL   (*color3fv)(ptr)
  35.   #else
  36.     #define COLOR_CALL   (*color4fv)(ptr)
  37.   #endif
  38.   #define NORMAL_CALL  (*normal3fv)(ptr)
  39.   #if (TEX_DIM == 1)
  40.     #define TEXTURE_CALL (*texCoord1fv)(ptr)
  41.   #elif (TEX_DIM == 2)
  42.     #define TEXTURE_CALL (*texCoord2fv)(ptr)
  43.   #elif (TEX_DIM == 3)
  44.     #define TEXTURE_CALL (*texCoord3fv)(ptr)
  45.   #else
  46.     #define TEXTURE_CALL (*texCoord4fv)(ptr)
  47.   #endif
  48.   #define INDEX_CALL   (*indexfv)(ptr)
  49.   #if (VERTEX_DIM == 2)
  50.     #define VERTEX_CALL  (*vertex2fv)(ptr)
  51.   #else
  52.     #define VERTEX_CALL  (*vertex3fv)(ptr)
  53.   #endif
  54.   #define BEGIN_CALL   (*begin)(primitiveType)
  55.   #define END_CALL     (*end)()
  56. #else
  57.   #if (COLOR_DIM == 3)
  58.     #define COLOR_CALL   glColor3fv(ptr)
  59.   #else
  60.     #define COLOR_CALL   glColor4fv(ptr)
  61.   #endif
  62.   #define NORMAL_CALL  glNormal3fv(ptr)
  63.   #if (TEX_DIM == 1)
  64.     #define TEXTURE_CALL glTexCoord1fv(ptr)
  65.   #elif (TEX_DIM == 2)
  66.     #define TEXTURE_CALL glTexCoord2fv(ptr)
  67.   #elif (TEX_DIM == 3)
  68.     #define TEXTURE_CALL glTexCoord3fv(ptr)
  69.   #else
  70.     #define TEXTURE_CALL glTexCoord4fv(ptr)
  71.   #endif
  72.   #define INDEX_CALL   glIndexfv(ptr)
  73.   #if (VERTEX_DIM == 2)
  74.     #define VERTEX_CALL  glVertex2fv(ptr)
  75.   #else
  76.     #define VERTEX_CALL  glVertex3fv(ptr)
  77.   #endif
  78.   #define BEGIN_CALL   glBegin(primitiveType)
  79.   #define END_CALL     glEnd()
  80. #endif
  81.  
  82. /* Define data definitions with pointer increments */
  83. #if (VISUAL == RGB)
  84.   #define COLOR_DATA COLOR_CALL; ptr += COLOR_DIM;
  85. #else
  86.   #define COLOR_DATA INDEX_CALL; ptr += 1;
  87. #endif
  88. #define NORMAL_DATA  NORMAL_CALL;  ptr += 3;
  89. #define TEXTURE_DATA TEXTURE_CALL; ptr += TEX_DIM;
  90. #define VERTEX_DATA VERTEX_CALL; ptr += VERTEX_DIM;
  91.  
  92. /* Specify the type of ColorData */
  93. #if (COLOR == PER_VERTEX)
  94.   #define VERTEX_COLOR_DATA COLOR_DATA
  95.   #define FACET_COLOR_DATA
  96. #elif (COLOR == PER_FACET)
  97.   #define HAS_FACET_DATA
  98.   #define VERTEX_COLOR_DATA
  99.   #define FACET_COLOR_DATA  COLOR_DATA
  100. #else
  101.   #define VERTEX_COLOR_DATA
  102.   #define FACET_COLOR_DATA
  103. #endif
  104.   
  105. /* Specify the type of NormalData */
  106. #if (NORMAL == PER_VERTEX)
  107.   #define VERTEX_NORMAL_DATA NORMAL_DATA
  108.   #define FACET_NORMAL_DATA
  109. #elif (NORMAL == PER_FACET)
  110.   #define HAS_FACET_DATA
  111.   #define VERTEX_NORMAL_DATA
  112.   #define FACET_NORMAL_DATA  NORMAL_DATA
  113. #else
  114.   #define VERTEX_NORMAL_DATA
  115.   #define FACET_NORMAL_DATA
  116. #endif
  117.   
  118. /* Specify the type of TexData */
  119. #if (TEXTURE == PER_VERTEX)
  120.   #define VERTEX_TEXTURE_DATA TEXTURE_DATA
  121. #else
  122.   #define VERTEX_TEXTURE_DATA
  123. #endif
  124.  
  125. /* This is the data that will be given for each vertex */
  126. #define PER_VERTEX_DATA \
  127.   VERTEX_COLOR_DATA     \
  128.   VERTEX_NORMAL_DATA    \
  129.   VERTEX_TEXTURE_DATA   \
  130.   VERTEX_DATA
  131.  
  132. /* This is the data that will be given before each facet */
  133. #define PER_FACET_DATA  \
  134.   FACET_COLOR_DATA      \
  135.   FACET_NORMAL_DATA
  136.  
  137. /* Unroll the facet into multiple vertices (however many are per facet) */
  138. #if (VERTS_PER_FACET == 1)
  139.   #define UNROLLED_FACET PER_VERTEX_DATA
  140. #elif (VERTS_PER_FACET == 2)
  141.   #define UNROLLED_FACET PER_VERTEX_DATA PER_VERTEX_DATA
  142. #elif (VERTS_PER_FACET == 3)
  143.   #define UNROLLED_FACET PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  144. #elif (VERTS_PER_FACET == 4)
  145.   #define UNROLLED_FACET PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  146. #elif (VERTS_PER_FACET == 5)
  147.   #define UNROLLED_FACET PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  148. #elif (VERTS_PER_FACET == 6)
  149.   #define UNROLLED_FACET PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  150. #elif (VERTS_PER_FACET == 7)
  151.   #define UNROLLED_FACET PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  152. #elif (VERTS_PER_FACET == 8)
  153.   #define UNROLLED_FACET PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  154. #endif
  155.  
  156. /* Unroll the vertices to the number specified */
  157. #if (UNROLL == 1)
  158.   #define UNROLLED_VERTICES PER_VERTEX_DATA
  159. #elif (UNROLL == 2)
  160.   #define UNROLLED_VERTICES PER_VERTEX_DATA PER_VERTEX_DATA
  161. #elif (UNROLL == 3)
  162.   #define UNROLLED_VERTICES PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  163. #elif (UNROLL == 4)
  164.   #define UNROLLED_VERTICES PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  165. #elif (UNROLL == 5)
  166.   #define UNROLLED_VERTICES PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  167. #elif (UNROLL == 6)
  168.   #define UNROLLED_VERTICES PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  169. #elif (UNROLL == 7)
  170.   #define UNROLLED_VERTICES PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  171. #elif (UNROLL == 8)
  172.   #define UNROLLED_VERTICES PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA PER_VERTEX_DATA
  173. #endif
  174.  
  175. #if (VERTS_PER_FACET == 9)
  176.   /* Special case, this is used if VERTS_PER_FACET is greater than 8 */
  177.   #define UNROLLED_FACET for (i=vertsPerFacet; i>0; i--) { PER_VERTEX_DATA }
  178.   #define DEFINE_VERTS_PER_FACET int vertsPerFacet = this->vertsPerFacet;
  179.   #define VERTS_PER_FACET_OVER_UNROLL vertsPerFacet
  180. #else
  181.   #define DEFINE_VERTS_PER_FACET
  182.   #define VERTS_PER_FACET_OVER_UNROLL (VERTS_PER_FACET/UNROLL)
  183. #endif
  184.  
  185. #if (UNROLL < VERTS_PER_FACET)
  186.   #define FACETS_PER_LOOP 1
  187.   #ifdef HAS_FACET_DATA
  188.     #define DEFINE_LOOPCOUNT int loopsPerBgnEnd = facetsPerBgnEnd;
  189.   #else
  190.     #define DEFINE_LOOPCOUNT int loopsPerBgnEnd = facetsPerBgnEnd*VERTS_PER_FACET_OVER_UNROLL;
  191.   #endif
  192.   #define FACET \
  193.     PER_FACET_DATA \
  194.     for (l=VERTS_PER_FACET_OVER_UNROLL; l>0; l--) { \
  195.       UNROLLED_VERTICES \
  196.     }
  197. #else
  198.   #define FACETS_PER_LOOP (UNROLL/VERTS_PER_FACET)
  199.   #define DEFINE_LOOPCOUNT int loopsPerBgnEnd = facetsPerBgnEnd/FACETS_PER_LOOP;
  200.   #define FACET \
  201.     PER_FACET_DATA \
  202.     UNROLLED_FACET
  203. #endif
  204.  
  205. #if (UNROLL > VERTS_PER_FACET)
  206.   #if (FACETS_PER_LOOP == 2)
  207.     #define DEFINE_CLEANUP int remainingFacets = facetsPerBgnEnd & 1;
  208.   #elif (FACETS_PER_LOOP == 3)
  209.     #define DEFINE_CLEANUP int remainingFacets = facetsPerBgnEnd % 3;
  210.   #elif (FACETS_PER_LOOP == 4)
  211.     #define DEFINE_CLEANUP int remainingFacets = facetsPerBgnEnd & 3;
  212.   #elif (FACETS_PER_LOOP == 5)
  213.     #define DEFINE_CLEANUP int remainingFacets = facetsPerBgnEnd % 5;
  214.   #elif (FACETS_PER_LOOP == 6)
  215.     #define DEFINE_CLEANUP int remainingFacets = facetsPerBgnEnd % 6;
  216.   #elif (FACETS_PER_LOOP == 7)
  217.     #define DEFINE_CLEANUP int remainingFacets = facetsPerBgnEnd % 7;
  218.   #elif (FACETS_PER_LOOP == 8)
  219.     #define DEFINE_CLEANUP int remainingFacets = facetsPerBgnEnd & 7;
  220.   #endif
  221.   #define CLEANUP_LOOP \
  222.     for (k=remainingFacets; k>0; k--) { \
  223.       FACET \
  224.     }
  225. #else
  226.   #define DEFINE_CLEANUP
  227.   #define CLEANUP_LOOP
  228. #endif
  229.  
  230. void FUNCTION (TestPtr thisTest)
  231. {
  232.     VertexPtr this = (VertexPtr)thisTest;
  233.     int i, j, k, l;
  234.     GLfloat* ptr;
  235.     GLfloat* traversalData = this->traversalData;
  236.     int iterations = this->iterations;
  237.     int numBgnEnds = this->numBgnEnds;
  238.     /* May want to compute loopsPerBgnEnd and remainingVerts outside timing loop */
  239.     int facetsPerBgnEnd = this->facetsPerBgnEnd;
  240.     DEFINE_VERTS_PER_FACET
  241.     DEFINE_LOOPCOUNT
  242.     DEFINE_CLEANUP
  243.     int primitiveType = this->primitiveType;
  244.   #ifdef FUNCTION_PTRS
  245.    #ifdef WIN32
  246.     #if (VISUAL == CI)
  247.       void (APIENTRY *indexfv)(const GLfloat*) = glIndexfv;
  248.     #else
  249.       #if (COLOR_DIM == 3)
  250.         void (APIENTRY *color3fv)(const GLfloat*) = glColor3fv;
  251.       #else
  252.         void (APIENTRY *color4fv)(const GLfloat*) = glColor4fv;
  253.       #endif
  254.       #if (TEX_DIM == 1)
  255.         void (APIENTRY *texCoord1fv)(const GLfloat*) = glTexCoord1fv;
  256.       #elif (TEX_DIM == 2)
  257.         void (APIENTRY *texCoord2fv)(const GLfloat*) = glTexCoord2fv;
  258.       #elif (TEX_DIM == 3)
  259.         void (APIENTRY *texCoord3fv)(const GLfloat*) = glTexCoord3fv;
  260.       #else
  261.         void (APIENTRY *texCoord4fv)(const GLfloat*) = glTexCoord4fv;
  262.       #endif
  263.     #endif
  264.     void (APIENTRY *normal3fv)(const GLfloat*) = glNormal3fv;
  265.     #if (VERTEX_DIM == 2)
  266.       void (APIENTRY *vertex2fv)(const GLfloat*) = glVertex2fv;
  267.     #else
  268.       void (APIENTRY *vertex3fv)(const GLfloat*) = glVertex3fv;
  269.     #endif
  270.     void (APIENTRY *begin)(GLenum) = glBegin;
  271.     void (APIENTRY *end)(void) = glEnd;
  272.    #else
  273.     #if (VISUAL == CI)
  274.       void (*indexfv)(const GLfloat*) = glIndexfv;
  275.     #else
  276.       #if (COLOR_DIM == 3)
  277.         void (*color3fv)(const GLfloat*) = glColor3fv;
  278.       #else
  279.         void (*color4fv)(const GLfloat*) = glColor4fv;
  280.       #endif
  281.       #if (TEX_DIM == 1)
  282.         void (*texCoord1fv)(const GLfloat*) = glTexCoord1fv;
  283.       #elif (TEX_DIM == 2)
  284.         void (*texCoord2fv)(const GLfloat*) = glTexCoord2fv;
  285.       #elif (TEX_DIM == 3)
  286.         void (*texCoord3fv)(const GLfloat*) = glTexCoord3fv;
  287.       #else
  288.         void (*texCoord4fv)(const GLfloat*) = glTexCoord4fv;
  289.       #endif
  290.     #endif
  291.     void (*normal3fv)(const GLfloat*) = glNormal3fv;
  292.     #if (VERTEX_DIM == 2)
  293.       void (*vertex2fv)(const GLfloat*) = glVertex2fv;
  294.     #else
  295.       void (*vertex3fv)(const GLfloat*) = glVertex3fv;
  296.     #endif
  297.     void (*begin)(GLenum) = glBegin;
  298.     void (*end)(void) = glEnd;
  299.    #endif
  300.   #endif
  301.  
  302.     for (i=iterations; i>0; i--) {
  303.       ptr = traversalData;
  304.       for (j=numBgnEnds; j>0; j--) {
  305.         BEGIN_CALL;
  306.         for (k=loopsPerBgnEnd; k>0; k--) {
  307.         #ifdef HAS_FACET_DATA
  308.           #if (FACETS_PER_LOOP >= 1)
  309.             FACET
  310.           #endif
  311.           #if (FACETS_PER_LOOP >= 2)
  312.             FACET
  313.           #endif
  314.           #if (FACETS_PER_LOOP >= 3)
  315.             FACET
  316.           #endif
  317.           #if (FACETS_PER_LOOP >= 4)
  318.             FACET
  319.           #endif
  320.           #if (FACETS_PER_LOOP >= 5)
  321.             FACET
  322.           #endif
  323.           #if (FACETS_PER_LOOP >= 6)
  324.             FACET
  325.           #endif
  326.           #if (FACETS_PER_LOOP >= 7)
  327.             FACET
  328.           #endif
  329.           #if (FACETS_PER_LOOP >= 8)
  330.             FACET
  331.           #endif
  332.     #else
  333.       UNROLLED_VERTICES
  334.         #endif
  335.     }
  336.     CLEANUP_LOOP
  337.     END_CALL;
  338.       }
  339.     }
  340. }
  341.  
  342. #undef COLOR_CALL
  343. #undef NORMAL_CALL
  344. #undef TEXTURE_CALL
  345. #undef INDEX_CALL
  346. #undef VERTEX_CALL
  347. #undef BEGIN_CALL
  348. #undef END_CALL
  349. #undef COLOR_DATA
  350. #undef NORMAL_DATA
  351. #undef TEXTURE_DATA
  352. #undef VERTEX_DATA
  353. #undef VERTEX_COLOR_DATA
  354. #undef FACET_COLOR_DATA
  355. #undef VERTEX_NORMAL_DATA
  356. #undef FACET_NORMAL_DATA
  357. #undef VERTEX_TEXTURE_DATA
  358. #undef HAS_FACET_DATA
  359. #undef PER_VERTEX_DATA
  360. #undef PER_FACET_DATA
  361. #undef UNROLLED_FACET
  362. #undef UNROLLED_VERTICES
  363. #undef FACETS_PER_LOOP
  364. #undef FACET
  365. #undef DEFINE_LOOPCOUNT
  366. #undef DEFINE_CLEANUP
  367. #undef CLEANUP_LOOP
  368. #undef DEFINE_VERTS_PER_FACET
  369. #undef VERTS_PER_FACET_OVER_UNROLL
  370.